JVM垃圾收集器 |
您所在的位置:网站首页 › parallel scavenge收集器 › JVM垃圾收集器 |
问题
带着问题去学习,效率更高! 垃圾收集器和垃圾回收算法的关系?分别请你谈谈? 怎么查看服务器的垃圾收集器是哪个?如何配置垃圾收集器?谈谈你对垃圾收集器的理解? 你知道G1垃圾收集器吗? 垃圾收集算法垃圾收集器和垃圾回收算法的关系? 垃圾算法(引用计数,复制算法,标记清除,标记整理)都是内存回收的方法论,垃圾收集器是这种算法的落地实现。 请移步JVM中的GC收集算法有哪些 先了解相关概念 垃圾收集器主要发生的区域主要发生在方法区和堆中,其中方法区在jdk1.8中的实现是元空间(Metaspace) 次收集器发生在新生代中的GC,被称为Young GC(Scavenge GC,Minor GC), 新生代中的对象大多数生命周期比较短,所以这里的GC发生很频繁。 全收集器Full GC,指发生在老年代的 GC,出现了 Full GC 一般会伴随着至少一次的 Young GC(老 年代的对象大部分是Young GC 过程中从新生代进入老年代),比如:分配担保失败。Full GC 的速度一般会比 Young GC 慢 10 倍以上。 什么时候触发GC 当 Eden 空间不足以为对象分配内存时,会触发 Young GC。 当老年代内存不足,或者显式调用 System.gc() 会触发Full GC(也会伴随着执行至少一次的Young GC)。 STW(Stop-the-world)和并发GC在运行的时候,暂停整个应用就叫STW。
并发这里只的是GC线程和用户线程一起运行,GC可能占用用户的线程。
串行:垃圾回收的时候只有一个GC线程工作。
并行:垃圾回收的时候有多个GC线程一起工作。
在单核的情况下,并行可能更慢。
单线程收集 收集时必须Stop The Word(停止所有的用户线程) jvm内存不大时停顿时间短(说明堆内存大小影响GC的效率) 对应JVM参数: -XX:UseSerialGC配置jvm的时候只需要配置年轻代的收集器即可,jvm会自动选择匹配的老年代收集器。 开启后会使用:年轻代使用Serial +老年代使用的是Serial Old 的收集器组合,说明都是使用的串行。 使用的算法为:年轻代使用复制算法,老年代使用标记-整理算法; 图例:多线程收集(是Serial的多线程版本) 单cpu的效率不及串行收集器Serial,多cpu肯定快于Serial 收集的过程中还是会暂停其他的用户线程。 可以控制ParNew的运行线程数,默认情况下线程数量和CPU核数的数目相同。 常用对应的JVM参数:-XX:UseParNewGC启用ParNew收集器只会影响年轻代的手机,不影响老年代。 开启后会使用:年轻代使用ParNew收集器, 老年代使用Serial Old 收集器, 注意:jdk8已经不推荐这么组合了!因为Serial Old要被弃用了。 使用的算法为:年轻代使用复制算法,老年代使用标记-整理算法; -XX:UseParallelGCThreads这个参数可以设置并行收集的线程数。(CPU>8 设置N=5/8 CPU 1) { jio_fprintf(defaultStream::error_stream(), "Conflicting collector combinations in option list; " "please refer to the release notes for the combinations " "allowed\n"); status = false; } return status; 查看正在运行的JVM垃圾收集器? 使用jps查出进程,使用jinfo打印运行的jvm参数 jinfo -flags PID
可以使用Jconsole,jvisualvm可视化工具进行查看 在项目启动的时候添加JVM参数:-XX:+PrintCommandLineFlags 也可以获得。 生产上怎么选择收集器?选择收集器应该考虑到服务器硬件的配置,以及应用程序的特点; 单CPU或者内存小的服务器,选择串行收集器 -XX:+UseSerial 多CPU,需要打的吞吐量的,选择并行收集器,如:后台计算较多的应用, -XX:+UseParallelGC 或者 -XX:+UseParallelOldGC 多cpu,追求停顿时间短的,选择并发收集器,如:需要快速响应的互联网应用 -XX:+UseConcMarkSweepGC jvm运行时数据区
决定这个变量或者对象实例是在栈中分配还是堆中分配,逃逸指的是这个变量或者对象实例的作用域是否超过当前方法(逃出了方法)。 如果一个对象实例仅仅在当前方法中使用,并没有通过【返回值返回出去】或者 【通过调用别的方法时作为参数传递过去】 那么这个对象就是没有发生逃逸,可以将这个对象分配在java栈空间中,栈空间是随着方法的执行结束而清理的,不需要GC,所以可以提高效率。 jvm中逃逸分析是可以设置开关的,默认是开启的。 其他概念 对象的创建过程的内存分配https://www.cnblogs.com/wangsen/p/11243049.html 对象的引用(强,软,弱,虚)https://www.cnblogs.com/wangsen/p/11206956.html https://www.cnblogs.com/rgever/p/8902210.html |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |